﻿// Author: Daniele Giardini - http://www.demigiant.com
// Created: 2018/07/13

#if true // MODULE_MARKER
using System;
using DG.Tweening.Core;
using DG.Tweening.Plugins.Options;
using UnityEngine;
#if UNITY_5 || UNITY_2017_1_OR_NEWER
using UnityEngine.Audio; // Required for AudioMixer
#endif

#pragma warning disable 1591
namespace DG.Tweening
{
	public static class DOTweenModuleAudio
	{
		#region Shortcuts

		#region Audio

		/// <summary>Tweens an AudioSource's volume to the given value.
		/// Also stores the AudioSource as the tween's target so it can be used for filtered operations</summary>
		/// <param name="endValue">The end value to reach (0 to 1)</param><param name="duration">The duration of the tween</param>
		public static TweenerCore<float, float, FloatOptions> DOFade(this AudioSource target, float endValue,
			float duration)
		{
			if (endValue < 0) endValue = 0;
			else if (endValue > 1) endValue = 1;
			TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.volume, x => target.volume = x,
				endValue, duration);
			t.SetTarget(target);
			return t;
		}

		/// <summary>Tweens an AudioSource's pitch to the given value.
		/// Also stores the AudioSource as the tween's target so it can be used for filtered operations</summary>
		/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
		public static TweenerCore<float, float, FloatOptions> DOPitch(this AudioSource target, float endValue,
			float duration)
		{
			TweenerCore<float, float, FloatOptions> t = DOTween.To(() => target.pitch, x => target.pitch = x, endValue,
				duration);
			t.SetTarget(target);
			return t;
		}

		#endregion

#if UNITY_5 || UNITY_2017_1_OR_NEWER

		#region AudioMixer (Unity 5 or Newer)

		/// <summary>Tweens an AudioMixer's exposed float to the given value.
		/// Also stores the AudioMixer as the tween's target so it can be used for filtered operations.
		/// Note that you need to manually expose a float in an AudioMixerGroup in order to be able to tween it from an AudioMixer.</summary>
		/// <param name="floatName">Name given to the exposed float to set</param>
		/// <param name="endValue">The end value to reach</param><param name="duration">The duration of the tween</param>
		public static TweenerCore<float, float, FloatOptions> DOSetFloat(this AudioMixer target, string floatName,
			float endValue, float duration)
		{
			TweenerCore<float, float, FloatOptions> t = DOTween.To(() =>
			{
				float currVal;
				target.GetFloat(floatName, out currVal);
				return currVal;
			}, x => target.SetFloat(floatName, x), endValue, duration);
			t.SetTarget(target);
			return t;
		}

		#region Operation Shortcuts

		/// <summary>
		/// Completes all tweens that have this target as a reference
		/// (meaning tweens that were started from this target, or that had this target added as an Id)
		/// and returns the total number of tweens completed
		/// (meaning the tweens that don't have infinite loops and were not already complete)
		/// </summary>
		/// <param name="withCallbacks">For Sequences only: if TRUE also internal Sequence callbacks will be fired,
		/// otherwise they will be ignored</param>
		public static int DOComplete(this AudioMixer target, bool withCallbacks = false)
		{
			return DOTween.Complete(target, withCallbacks);
		}

		/// <summary>
		/// Kills all tweens that have this target as a reference
		/// (meaning tweens that were started from this target, or that had this target added as an Id)
		/// and returns the total number of tweens killed.
		/// </summary>
		/// <param name="complete">If TRUE completes the tween before killing it</param>
		public static int DOKill(this AudioMixer target, bool complete = false)
		{
			return DOTween.Kill(target, complete);
		}

		/// <summary>
		/// Flips the direction (backwards if it was going forward or viceversa) of all tweens that have this target as a reference
		/// (meaning tweens that were started from this target, or that had this target added as an Id)
		/// and returns the total number of tweens flipped.
		/// </summary>
		public static int DOFlip(this AudioMixer target)
		{
			return DOTween.Flip(target);
		}

		/// <summary>
		/// Sends to the given position all tweens that have this target as a reference
		/// (meaning tweens that were started from this target, or that had this target added as an Id)
		/// and returns the total number of tweens involved.
		/// </summary>
		/// <param name="to">Time position to reach
		/// (if higher than the whole tween duration the tween will simply reach its end)</param>
		/// <param name="andPlay">If TRUE will play the tween after reaching the given position, otherwise it will pause it</param>
		public static int DOGoto(this AudioMixer target, float to, bool andPlay = false)
		{
			return DOTween.Goto(target, to, andPlay);
		}

		/// <summary>
		/// Pauses all tweens that have this target as a reference
		/// (meaning tweens that were started from this target, or that had this target added as an Id)
		/// and returns the total number of tweens paused.
		/// </summary>
		public static int DOPause(this AudioMixer target)
		{
			return DOTween.Pause(target);
		}

		/// <summary>
		/// Plays all tweens that have this target as a reference
		/// (meaning tweens that were started from this target, or that had this target added as an Id)
		/// and returns the total number of tweens played.
		/// </summary>
		public static int DOPlay(this AudioMixer target)
		{
			return DOTween.Play(target);
		}

		/// <summary>
		/// Plays backwards all tweens that have this target as a reference
		/// (meaning tweens that were started from this target, or that had this target added as an Id)
		/// and returns the total number of tweens played.
		/// </summary>
		public static int DOPlayBackwards(this AudioMixer target)
		{
			return DOTween.PlayBackwards(target);
		}

		/// <summary>
		/// Plays forward all tweens that have this target as a reference
		/// (meaning tweens that were started from this target, or that had this target added as an Id)
		/// and returns the total number of tweens played.
		/// </summary>
		public static int DOPlayForward(this AudioMixer target)
		{
			return DOTween.PlayForward(target);
		}

		/// <summary>
		/// Restarts all tweens that have this target as a reference
		/// (meaning tweens that were started from this target, or that had this target added as an Id)
		/// and returns the total number of tweens restarted.
		/// </summary>
		public static int DORestart(this AudioMixer target)
		{
			return DOTween.Restart(target);
		}

		/// <summary>
		/// Rewinds all tweens that have this target as a reference
		/// (meaning tweens that were started from this target, or that had this target added as an Id)
		/// and returns the total number of tweens rewinded.
		/// </summary>
		public static int DORewind(this AudioMixer target)
		{
			return DOTween.Rewind(target);
		}

		/// <summary>
		/// Smoothly rewinds all tweens that have this target as a reference
		/// (meaning tweens that were started from this target, or that had this target added as an Id)
		/// and returns the total number of tweens rewinded.
		/// </summary>
		public static int DOSmoothRewind(this AudioMixer target)
		{
			return DOTween.SmoothRewind(target);
		}

		/// <summary>
		/// Toggles the paused state (plays if it was paused, pauses if it was playing) of all tweens that have this target as a reference
		/// (meaning tweens that were started from this target, or that had this target added as an Id)
		/// and returns the total number of tweens involved.
		/// </summary>
		public static int DOTogglePause(this AudioMixer target)
		{
			return DOTween.TogglePause(target);
		}

		#endregion

		#endregion

#endif

		#endregion
	}
}
#endif